注册树模式 与 适配器模式

注册树模式 干啥用的???

直接获取1个已经创建好的对象

正常情况下,我们现在获取对象的方法主要有2种:

new 实例化
访问静态方法

创建1个注册类(Think\Register.php)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
namespace Think;

class Register
{
protected static $obj = [];

public static function set($alias, $object)
{
self::$obj[$alias] = $object;
}

//销毁对象
public static function _unset($alias)
{
unset(self::$obj[$alias]);
}

//得到
public static function get($alias)
{
return self::$obj[$alias];
}
}

改造工厂类

1
2
3
4
5
6
7
8
9
10
11
12
class Factory
{
static function createDatabase()
{
$db = Database::getInstance();

Register::set('db666',$db);
//销毁对象
//Register::_unset('db666');
return $db;
}
}

入口文件调用(index.php)

1
2
3
4
5
6
7
8
9
10
11
12
// 入口文件
define('BASEDIR', __DIR__);
include BASEDIR . '/Think/Loder.php';
spl_autoload_register('\\Think\\Loder::autoload');

//工厂模式实例化对象,并注册
$obj = Think\Factory::createDatabase();

//注册后,获取该对象
$db666 = Think\Register::get('db666');

var_dump($obj === $db666);

适配器模式

适用场景:

可以将不同的函数接口封装成统一的API;

PHP的数据库操作有 mysql, mysqli, pdo 3种,可以用适配器模式统一成一致的方法。

类似的场景还有cache适配器,将 memcache, redis, file, apc 等不同的缓存函数,统一成一致。(Thinkphp5 缓存实现)

定义一个接口(framework\Think\IDatabase.php)

1
2
3
4
5
6
7
8
9
namespace Think;

// 定义一个数据库的适配器接口类
interface IDatabase
{
function connect($host, $user, $passwd, $dbname);
function query($sql);
function close();
}

创建3个数据库的操作类(实现其接口)

继承同一个适配器接口,使用一致的操作数据库方法。

MySql(framework\Think\Database\MySQL.php)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
namespace Think\Database;
use Think\IDatabase;

class MySQL implements IDatabase
{
protected $conn;
function connect($host, $user, $passwd, $dbname)
{
$conn = mysql_connect($host, $user, $passwd);
mysql_select_db($dbname, $conn);
$this->conn = $conn;
}

function query($sql)
{
$ret = mysql_query($sql, $this->conn);
return $ret;
}

function close()
{
mysql_close($this->conn);
}
}

MySQLi(framework\Think\Database\MySQLi.php)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
namespace Think\Database;
use Think\IDatabase;

class MySQLi implements IDatabase
{
protected $conn;
function connect($host, $user, $passwd, $dbname)
{
$conn = mysqli_connect($host, $user, $passwd, $dbname);
$this->conn = $conn;
}

function query($sql)
{
$res = mysqli_query($this->conn, $sql);
return $res;
}

function close()
{
mysqli_close($this->conn);
}
}

MySQLi(framework\Think\Database\PDO.php)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
namespace Think\Database;
use Think\IDatabase;

class PDO implements IDatabase
{
function connect($host, $user, $passwd, $dbname)
{
$conn = new \PDO("mysql:host={$host}; dbname={$dbname}", $user, $passwd);
$this->conn = $conn;
}

function query($sql)
{
return $this->conn->query($sql);
}

function close()
{
unset($this->conn);
}
}

入口文件中调用(framework\index.php)

1
2
3
4
5
6
7
8
9
10
11
// 入口文件
define('BASEDIR', __DIR__);
include BASEDIR . '/Think/Loder.php';
spl_autoload_register('\\Think\\Loder::autoload');

$db = new Think\Database\MySQLi();
$db->connect('localhost', 'root', 'root', 'demo');
$ret = $db->query('show databases');
$db->close();

var_dump($ret);

随某人喜欢历史句子之一: 春秋霸主,唯我独尊.齐桓公真的厉害….

纵有疾风起,人生不言弃!